import datetime
from celery import Celery, current_task
import setting
import dbClipExecute
import requests
import os
from clipClass import ClipClass

# 根据字幕设置的内容进行剪切，如果需要加字幕，则需要先处理字幕，然后再进行剪切；
clip_broker = os.environ.get('CLIP_BROKER')
clip_backend = os.environ.get('CLIP_BACKEND')
subpath = os.environ.get("SUBTASK_PATH")
suburl = os.environ.get("SUBTASK_URL")

class CustomError(Exception):
    pass
# 通过celery来实现异步任务的执行;
celeryClipTask = Celery("celeryClipTask", broker=clip_broker, backend=clip_backend)

@celeryClipTask.task
def clipTask(rjson, subdata, flag):

    # taskid = rjson["id"]
    tmd5 = rjson["tmd5"]
    brate = rjson["brate"]
    resolution = rjson["resolution"]
    # 该处获取的数据库中的1080P的视频文件路径（该路径能够被本服务器访问)
    videopath = rjson["videopath"]
    # 获取自身任务的ID, step==1时，uuid的值放入到uuid1字段中，step==2时(剪切),放入到uuid2字段中；uuid1不变，做为查询日志时使用
    uuid1 = current_task.request.id
    print(f"当前任务的ID[{uuid1}]")
    dbClipExecute.setClipSubTaskProcess(uuid1, 1)
    dbClipExecute.addClipTaskLog(uuid1, "开始进行剪辑任务处理")

    # 因为生成ASR后，很多的地址都应该改为新的地址，所以此处根据md5的地址，结合setup的值，来更新数据库的地址，原文件的地址更新为1080的地址，review的地址更新为360p的地址；
    cc = ClipClass(videopath, uuid1, tmd5, subdata, brate, resolution, flag)
    path, url = cc.execute()
    if(path == None):
        # 错误结果
        dbClipExecute.setClipSubTaskProcess(uuid1, 100, 2)
        dbClipExecute.addClipTaskLog(uuid1, "处理剪切任务错误")
        raise Exception('处理错误')
        return
    dbClipExecute.setClipSubTaskProcess(uuid1, 100)
    dbClipExecute.updateClipSubOutUrl(uuid1, url)
    logstr = f"任务处理完成，<a href='{url}' style='color:blue;text-decoration: underline;'>下载</a>&nbsp;处理结果!"
    dbClipExecute.addClipTaskLog(uuid1, logstr)
    return

if __name__ == '__main__':
    celeryClipTask.worker_main(['worker', '--loglevel', 'info', '--pool', 'solo', '--purge'])
    # 在此设定4个进程并发，是与后台的ASR的GPU并行能力相配合；
    # celeryClipTask.worker_main(['worker', '--loglevel', 'info', '-c', 4])
